Javascript.RU

Создать новую тему Ответ
 
Опции темы Искать в теме
  #1 (permalink)  
Старый 17.04.2022, 09:21
Аспирант
Отправить личное сообщение для Judgin Посмотреть профиль Найти все сообщения от Judgin
 
Регистрация: 31.05.2021
Сообщений: 32

Получить значения массива, за пределами Promise
Как в моем случае получить значения массива urlArr за пределами Promise? Прочитал что нужно использовать async/await, но как конкретно не понял. Прошу помочь разобраться.

let arr = ['А был ли Каротин?', 'А вы любили когда-нибудь?', 'А ну-ка, дедушки!', 'Автомобиль на крыше', 'Автомобиль, скрипка и собака Клякса', 'Адам и Хева', 'Айболит-66', 'Акселератка', 'Актриса (фильм)', 'Алёнка (фильм)', 'Алёша Птицын вырабатывает характер', 'Алёшкина любовь', 'Альманах сатиры и юмора', 'Ангел в тюбетейке', 'Антон Иванович сердится', 'Антоша Рыбкин', 'Ар-хи-ме-ды!', 'Аринка', 'Артист из Кохановки', 'Аршин мал алан (фильм, 1945)', 'Аршин мал алан (фильм, 1965)', 'Ау-у!', 'Аферисты (фильм, 1990)', 'Афоня'];

for(i = 0; i < arr.length; i++) {
    fetch(`https://ru.wikipedia.org/w/api.php?action=query&prop=imageinfo&titles=${arr[i]}&format=json&iiprop=url&generator=images&origin=*`)
    .then (function(response) {
  	return response.json();
    })
    .then (function(data) {
        urlArr = [];
	let imgObj = Object.values(data.query.pages);
	let imgUrl = imgObj[0].imageinfo[0].url;
	urlArr.push(imgUrl);
    })
}
console.log(urlArr);
Ответить с цитированием
  #2 (permalink)  
Старый 17.04.2022, 11:14
Аватар для ksa
ksa ksa вне форума
CacheVar
Отправить личное сообщение для ksa Посмотреть профиль Найти все сообщения от ksa
 
Регистрация: 19.08.2010
Сообщений: 14,277

Сообщение от Judgin
Прочитал что нужно использовать async/await, но как конкретно не понял.
Например вот так
(async _ => {
	const val = await test()
	alert(val)
})()

function test() {
	return new Promise((resolve) => {
		setTimeout(_ => resolve('ok'), 2000)
	})
}


Сообщение от Judgin
Как в моем случае получить значения массива urlArr за пределами Promise?
Почему многие так стараются "притянуть" асинхронные действия к виду синхронных?

В твоем примере ты и так получишь ответ от "промиса". Но тебе почему-то нужно это получить не в then, а именно после вызова промиса.
Возможно такое начинают творить не понимая как можно работать с асинхронными действиями?

Judgin, у тебя ведь получается целый массив таких промисов... Запросто можно применить промисное АПИ. Или цепочку промисов, если она требуется...
Ответить с цитированием
  #3 (permalink)  
Старый 18.04.2022, 12:45
Аспирант
Отправить личное сообщение для Judgin Посмотреть профиль Найти все сообщения от Judgin
 
Регистрация: 31.05.2021
Сообщений: 32

Сообщение от ksa Посмотреть сообщение
Например вот так
(async _ => {
	const val = await test()
	alert(val)
})()

function test() {
	return new Promise((resolve) => {
		setTimeout(_ => resolve('ok'), 2000)
	})
}



Почему многие так стараются "притянуть" асинхронные действия к виду синхронных?

В твоем примере ты и так получишь ответ от "промиса". Но тебе почему-то нужно это получить не в then, а именно после вызова промиса.
Возможно такое начинают творить не понимая как можно работать с асинхронными действиями?

Judgin, у тебя ведь получается целый массив таких промисов... Запросто можно применить промисное АПИ. Или цепочку промисов, если она требуется...
Проблема в том, что в скрипте ранее уже используются промисы, а в этом куске кода который я привел выше имеется цикл for и я не могу завершить данный цикл, так как в нем находится промис. А мне его нужно завершить, так как ниже расположенный код не должен находиться в данном цикле. Как решить данную проблему?

const secondPage = "page|279ca2067846c0060304271a0662e878f4f4011301eebfee0a|596563";
Promise.all([

	fetch("https://ru.wikipedia.org/w/api.php?action=query&list=categorymembers&cmtitle=%D0%9A%D0%B0%D1%82%D0%B5%D0%B3%D0%BE%D1%80%D0%B8%D1%8F:%D0%9A%D0%B8%D0%BD%D0%BE%D0%BA%D0%BE%D0%BC%D0%B5%D0%B4%D0%B8%D0%B8%20%D0%A1%D0%A1%D0%A1%D0%A0&cmlimit=500&format=json&prop=iwlinks&origin=*"),

	fetch(`https://ru.wikipedia.org/w/api.php?action=query&list=categorymembers&cmtitle=%D0%9A%D0%B0%D1%82%D0%B5%D0%B3%D0%BE%D1%80%D0%B8%D1%8F:%D0%9A%D0%B8%D0%BD%D0%BE%D0%BA%D0%BE%D0%BC%D0%B5%D0%B4%D0%B8%D0%B8%20%D0%A1%D0%A1%D0%A1%D0%A0&cmlimit=500&format=json&prop=iwlinks&origin=*&cmcontinue=${secondPage}`)

])
.then (function(responses){ 
	return Promise.all(responses.map(function(response) {
  	return response.json();
  	
}));

}) .then (function(data) {
  	let fObject = data[0].query.categorymembers;
	let sObject = data[1].query.categorymembers;
  	let fullObject =  fObject.concat(sObject);
  	arr = [];
	for(j = 0; j < fullObject.length; j++) {
  	    delete fullObject[j].pageid;
  	    delete fullObject[j].ns;
	}

//CONVERT STRUCTURE OF OBJECT
arr = fullObject.map(function(obj) {
  	return obj.title;
});
const groupNames = arr => {
   	const map = arr.reduce((acc, val) => {
     	let char = val.charAt(0).toUpperCase();
      	acc[char] = [].concat((acc[char] || []), val);
      	return acc;
}, {});
const res = Object.keys(map).map(el => ({
    letter: el,
    names: map[el]
}));
return res;
};

//EDIT ARRAY
arrEdited = groupNames(arr);
let namesArrEdited = arrEdited[12].names;
namesArrEdited.splice(41, 9);
namesArrEdited.push('Кыш и два портфеля');
arrEdited[0].names.push('4:0 в пользу Танечки');
arrEdited.splice(1, 1);
arrEdited.splice(19, 1);
arrEdited.splice(30, 1);
for(i = 0; i < arr.length; i++) {
    fetch(`https://ru.wikipedia.org/w/api.php?action=query&prop=imageinfo&titles=${arr[i]}&format=json&iiprop=url&generator=images&origin=*`)
    .then (function(response) {
    return response.json();
   })
   .then (function(data) {
        urlArr = [];
        let imgObj = Object.values(data.query.pages);
        let imgUrl = imgObj[0].imageinfo[0].url;
        urlArr.push(imgUrl);
     })
}

console.log(urlArr);

});
Ответить с цитированием
  #4 (permalink)  
Старый 18.04.2022, 12:47
Аватар для ksa
ksa ksa вне форума
CacheVar
Отправить личное сообщение для ksa Посмотреть профиль Найти все сообщения от ksa
 
Регистрация: 19.08.2010
Сообщений: 14,277

Для последовательной обработки промисов нужно строить цепочку промисов...
Ответить с цитированием
Ответ



Опции темы Искать в теме
Искать в теме:

Расширенный поиск


Похожие темы
Тема Автор Раздел Ответов Последнее сообщение
Перебор эл. массива с целью присвоения значения переменной. uzlprog Events/DOM/Window 17 07.09.2021 13:32
Как получить значения вышестоящих элементов дерева TreeStore ? Allan Stark ExtJS 1 31.07.2012 16:48
Получить значения из формы VistaSV30 Общие вопросы Javascript 1 20.01.2011 20:12
Как получить значения стиля Glook jQuery 2 18.12.2010 13:18
Получить значения доп. полей select-option arcanerain Общие вопросы Javascript 11 29.09.2010 03:02